package server.controlleurs.lobby;

import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.io.Serializable;

import rmi.Constantes;
import rmi.UtilitairesRmi;
import server.controlleurs.partie.IPartieControlleur;
import server.controlleurs.partie.PartieControlleur;
import server.models.participant.IParticipant;
import server.models.participant.Participant;
import server.models.partie.IPartie;
import server.models.partie.Partie;

public class LobbyControlleur implements Serializable, ILobbyControlleur {
	
	private static final long serialVersionUID = 1L;
	private ArrayList<IParticipant> listeParticipants = new ArrayList<IParticipant>();
	private ArrayList<IPartieControlleur> listePartieControlleur = new ArrayList<IPartieControlleur>();
	
	public LobbyControlleur() {
		
		try {
			UtilitairesRmi.getInstance().bind(Constantes.Controlleurs.LOBBY, this);
			this.listePartieControlleur.add((IPartieControlleur)UtilitairesRmi.getInstance().obtenirEtBind(Constantes.Controlleurs.PARTIE, new PartieControlleur()));
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public ArrayList<IParticipant> getListeParticipants() {
		return this.listeParticipants;
	}
	
	public ArrayList<IPartieControlleur> getListePartieControlleur() {
		return this.listePartieControlleur;		
	}
	
	public IPartie getPartie(int partie) throws RemoteException {
		return this.listePartieControlleur.get(partie).getPartie();
		
	}
	
	/**
	 * Ajouter un participant
	 * @param participant Le participant qui est connecté
	 */
	public void ajouterParticipant(Participant participant) {
		this.listeParticipants.add(participant);
	}
	
	/**
	 * Retirer un participant
	 * @param participant Le participant a d�connecter
	 * @throws RemoteException 
	 */
	public void retirerParticipant(Participant participant) throws RemoteException {
		if (participantExiste(participant)) {
			this.listeParticipants.remove(participant);
		}
	}
	
	public IPartie joindrePartie(Participant participant) throws RemoteException, AlreadyBoundException, NotBoundException {
		//TEMPORAIRE, utilise le PartieControlleur à la positon 0 de la liste de PartieControlleur
		this.listePartieControlleur.get(0).joindreParticipant(participant);
		return this.listePartieControlleur.get(0).getPartie();
	}
	
	/**
	 * Vérifie si un participant est dans la liste des participants
	 * @param participant Le participant que l'on veut vérifier
	 * @return true si le participant existe, false sinon
	 * @throws RemoteException 
	 */
	private boolean participantExiste(IParticipant participantAValide) throws RemoteException {
		for (IParticipant participant : this.listeParticipants) {
			if (participant.getSurnom() == participantAValide.getSurnom()) {
				return true;
			}
		}
		return false;
	}
}
